﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace DAL
{
    public class DataAccess
    {
        private string connectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ESHOPPER.mdf;Integrated Security=True;User Instance=True";
        private SqlConnection conn;
        private SqlDataAdapter da;
        private SqlCommand cmd;

        public DataAccess()
        {
        }

        /// <summary>
        /// Mở kết nối
        /// </summary>
        private void OpenConnect()
        {
            if (conn == null)
            {
                // khoi tao phuong thuc ket noi toi csdl
                conn = new SqlConnection(connectString);
            }

            if (conn != null && conn.State == ConnectionState.Closed)
            {
                // nếu trạng thái kết nối là đóng thì sẽ có mở kết nối
                conn.Open();
            }
        }

        /// <summary>
        /// Đóng kết nối
        /// </summary>
        private void CloseConnect()
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }

        /// <summary>
        /// Lấy dữ liệu từ CSDL
        /// </summary>
        /// <param name="sql">Câu query</param>
        /// <returns>Dữ liệu</returns>
        public DataTable GetData(string sql)
        {
            OpenConnect();
            cmd = new SqlCommand(sql, conn);
            // su dung sqlcommand de lay du lieu
            da = new SqlDataAdapter(cmd);

            DataTable dt = new DataTable();
            // do toan bo du lieu vao datatable
            da.Fill(dt);

            // giải phóng dữ liệu
            da.Dispose();

            CloseConnect();
            return dt;
        }

        public DataTable GetData(string sql, List<SqlParameter> lstParam)
        {
            OpenConnect();
            cmd = new SqlCommand(sql, conn);

            foreach (SqlParameter param in lstParam)
            {
                cmd.Parameters.Add(param);
            }
            // su dung sqlcommand de lay du lieu
            da = new SqlDataAdapter(cmd);

            DataTable dt = new DataTable();
            // do toan bo du lieu vao datatable
            da.Fill(dt);

            // giải phóng dữ liệu
            da.Dispose();

            CloseConnect();
            return dt;
        }

        /// <summary>
        /// Lấy dữ liệu từ CSDL
        /// </summary>
        /// <param name="sql">Câu query</param>
        /// <returns>Dữ liệu</returns>
        public DataTable GetData(string sql, SqlParameter[] param)
        {
            OpenConnect();
            cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddRange(param);
            // su dung sqlcommand de lay du lieu
            da = new SqlDataAdapter(cmd);

            DataTable dt = new DataTable();
            // do toan bo du lieu vao datatable
            da.Fill(dt);

            // giải phóng dữ liệu
            da.Dispose();

            CloseConnect();
            return dt;
        }

        /// <summary>
        /// Lấy dữ liệu (chỉ 1 giá trị là số) từ CSDL
        /// </summary>
        /// <param name="sql">Câu query</param>
        /// <returns>Dữ liệu (chỉ 1 giá trị là số)</returns>
        public int GetNumberData(string sql)
        {
            OpenConnect();
            SqlCommand cmd = new SqlCommand(sql, conn);
            int count = int.Parse(cmd.ExecuteScalar().ToString());
            CloseConnect();

            return count;
        }

        /// <summary>
        /// Lấy dữ liệu (chỉ 1 giá trị là số) từ CSDL
        /// </summary>
        /// <param name="sql">Câu query</param>
        /// <returns>Dữ liệu (chỉ 1 giá trị là số)</returns>
        public int GetNumberData(string sql, SqlParameter[] param)
        {
            OpenConnect();
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddRange(param);
            int count = int.Parse(cmd.ExecuteScalar().ToString());
            CloseConnect();

            return count;
        }

        /// <summary>
        /// Lấy dữ liệu (chỉ 1 giá trị là ký tự) từ CSDL
        /// </summary>
        /// <param name="sql">Câu query</param>
        /// <returns>Dữ liệu (chỉ 1 giá trị là ký tự)</returns>
        public string GetStringData(string sql)
        {
            OpenConnect();
            SqlCommand cmd = new SqlCommand(sql, conn);
            string str = cmd.ExecuteScalar().ToString();
            CloseConnect();

            return str;
        }

        /// <summary>
        /// Sử dụng trong trường hợp
        /// insert, update, delete
        /// </summary>
        /// <param name="sql">Câu query</param>
        /// <returns>true : nếu thành công</returns>
        public bool Execute(string sql)
        {
            OpenConnect();
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.ExecuteNonQuery();
            CloseConnect();
            return true;
        }

        /// <summary>
        /// Sử dụng trong trường hợp
        /// insert, update, delete
        /// </summary>
        /// <param name="sql">Câu query</param>
        /// <returns>true : nếu thành công</returns>
        public bool Execute(string sql, SqlParameter[] param)
        {
            OpenConnect();
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddRange(param);
            cmd.ExecuteNonQuery();
            CloseConnect();
            return true;
        }

        public DataTable GetDataLoaiHang()
        {
            // chuoi ket noi toi csdl
            //string connectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=d:\Inet\inet13\TinhNQ\LAB\ProjectVLIB\ESHOPPER.mdf;Integrated Security=True;User Instance=True";
            // khoi tao phuong thuc ket noi toi csdl
            //SqlConnection conn = new SqlConnection(connectString);
            // mo ket noi
            //conn.Open();

            // cau query select
            string sql = "select * from tbl_LoaiHang ";
            //SqlCommand cmd = new SqlCommand(sql, conn);
            // su dung sqlcommand de lay du lieu
            //SqlDataAdapter da = new SqlDataAdapter(cmd);

            DataTable dt = new DataTable();
            // do toan bo du lieu vao datatable
            dt = GetData(sql);
            //da.Fill(dt);

            // dong ket noi
            //conn.Close();

            return dt;
        }

        public DataTable GetDataLoaiHang(string maLoaiHang)
        {
            // chuoi ket noi toi csdl
            //string connectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=d:\Inet\inet13\TinhNQ\LAB\ProjectVLIB\ESHOPPER.mdf;Integrated Security=True;User Instance=True";
            // khoi tao phuong thuc ket noi toi csdl
            //SqlConnection conn = new SqlConnection(connectString);
            // mo ket noi
            //conn.Open();

            // cau query select
            //string sql = "select * from tbl_LoaiHang WHERE MaLoaiHang =N'" + maLoaiHang + "'";
            string sql = "select * from tbl_LoaiHang WHERE MaLoaiHang = @MaLoaiHang";

            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@MaLoaiHang", SqlDbType.Int);
            param[0].Value = maLoaiHang;

            //SqlCommand cmd = new SqlCommand(sql, conn);
            // su dung sqlcommand de lay du lieu
            //SqlDataAdapter da = new SqlDataAdapter(cmd);

            DataTable dt = new DataTable();
            // do toan bo du lieu vao datatable
            dt = GetData(sql, param);
            //da.Fill(dt);

            // dong ket noi
            //conn.Close();

            return dt;
        }

        public int GetCountLoaiHang()
        {
            // chuoi ket noi toi csdl
            //string connectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=d:\Inet\inet13\TinhNQ\LAB\ProjectVLIB\ESHOPPER.mdf;Integrated Security=True;User Instance=True";
            // khoi tao phuong thuc ket noi toi csdl
            //SqlConnection conn = new SqlConnection(connectString);
            // mo ket noi
            //conn.Open();

            // cau query select
            string sql = "select count(*) from tbl_LoaiHang";
            //SqlCommand cmd = new SqlCommand(sql, conn);
            //int count = int.Parse(cmd.ExecuteScalar().ToString());
            int count = GetNumberData(sql);

            // dong ket noi
            //conn.Close();

            return count;
        }

        public bool InsertLoaiHang(string tenLoaiHang)
        {
            // chuoi ket noi toi csdl
            //string connectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=d:\Inet\inet13\TinhNQ\LAB\ProjectVLIB\ESHOPPER.mdf;Integrated Security=True;User Instance=True";
            // khoi tao phuong thuc ket noi toi csdl
            //SqlConnection conn = new SqlConnection(connectString);
            // mo ket noi
            //conn.Open();

            // cau query select
            string sql = "INSERT INTO tbl_LoaiHang (TenLoaiHang) VALUES (N'" + tenLoaiHang + "')";
            Execute(sql);
            //SqlCommand cmd = new SqlCommand(sql, conn);
            //cmd.ExecuteNonQuery();

            // dong ket noi
            //conn.Close();

            return true;
        }
    }
}
